package com.esteel.coroutine

import android.arch.lifecycle.Observer
import android.arch.lifecycle.ViewModelProvider
import android.arch.lifecycle.ViewModelProviders
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import com.esteel.coroutine.viewmodel.MainViewModel
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.coroutines.*


/**
 * Android网络框架选择:
 * 1.Google第三方网络请求框架
 * 2.Java+Retrofit+MVP+Rxjava(+Dagger太过笨重)
 * 3.kotlin+mvvm+协程+Retrofit(拥有kotlin高阶函数,Google的技术支持,更加轻便的网络切换框架)
 *
 * kotlin中协成启动三种方式:
 * runBlocking:T  runBlocking启动的协程任务会阻断当前线程，直到该协程执行结束。
 * GlobalScope.launch:我们最常用的用于启动协程的方式，它最终返回一个Job类型的对象，
 * 这个Job类型的对象实际上是一个接口，
 * 它包涵了许多我们常用的方法。例如join()启动一个协程、cancel() 取消一个协程
 *
 * async/await:最常用方法
 *
 * Kotlin+ViewModel+LiveData+LifeCycle+Retrofit+协程()去除繁重的rxjava请求,去除presener的无情无义
 */
class MainActivity : AppCompatActivity() {

    private lateinit var mainViewModel: MainViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

//        val launch = GlobalScope.launch {
//            //后台耗时操作
//            Thread.sleep(600)
//            println("---->>执行了")
//        }
//
//        launch.invokeOnCompletion {
//            runOnUiThread {
//                tv_test.text = "执行完成"
//            }
//        }


        GlobalScope.launch {
            val result = async {
                //网络请求
                Thread.sleep(600)
                return@async "赵宏图";
            }
            val responseInfo = result.await()
            runOnUiThread {
                tv_test.text = responseInfo
            }
            println("--->>${result.await()}--->>${Thread.currentThread()}")

        }

        mainViewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
        mainViewModel.getLiveData().observe(this, Observer<String?> { data -> tv_test.text = data })

        mainViewModel.onGetInfo()
    }


}
